Skip to main content

基础使用

官方文档:https://docs.docker.com/compose/install/

基础使用

基础步骤

  • 通过dockerfile定义应用程序的环境
  • 通过docker-compose.yml自定意义应用的环境容器
  • 最后执行 docker-compose up运行所有容器

安装

安装内置版

yum install docker-compose-plugin -y

# 检查是否安装成功
docker compose version

安装独立版(不推荐,官方貌似放弃维护)

# 下载
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 给予执行权限
chmod +x /usr/local/bin/docker-compose
chmod a+rx /usr/local/bin/docker-compose

# 查看是否安装成功
docker-compose -h
docker-compose -v

卸载

sudo rm /usr/local/bin/docker-compose

常用指令

# 验证当前文件夹下的 "docker-compose.yml" 文件是否合法
docker-compose config

# 查看当前文件夹的执行配置
docker compose config

docker compose convert

# 启动一个yml文件
docker compose up
docker compose up -d # -d 后台运行容器

# 启动yml中的指定容器
docker compose run <servers名> env

# 查看指定服务的log
docer compose logs <服务名>
docer compose logs <服务名>

# 查看当前运行情况
docker compose ps

# 停止
docker compose stop

# 删除容器
docker compose down --volumes

环境变量

Compose配置环境变量的方式有很多种,一下根据

优先等级:

  1. Compose file

    在 docker-compose.yml 文件中直接设置的值优先级是最高的。

  2. Shell environment variables

    当前 shell 中 export 的环境变量值

  3. Environment file

    环境变量文件.envenv_file:xxx中定义的值。

  4. Dockerfile

  5. Variable is not defined

配置文件

默认情况下

顶层变量

变量名说明备注
version指定本 yml 依从的 compose 哪个版本制定的
service
networks网络配置
volumes

networks

默认情况下docker-compose会建立一个默认的网络,名称为docker-compose.yml所在目录名称小写形式加上“_default”,我们的TFLinux环境就是“tflinux_default”。

这个默认网络会对所有services下面的服务生效,所以services下面的各个服务之间才能够通过service名称互相访问。

子级变量说明备注
aliases
restart
secrets
networks:
restart: always
default:
driver: bridge
<自定义一个网络>
driver: bridge

固定ip地址设置

networks:
loki:
ipam:
driver: default
config:
- subnet: "172.22.0.0/24"
gateway: 172.22.0.1

services:
web:
image: beyond147896/resty:latest
ports:
- "80:80"
- "443:443"
networks:
loki:
ipv4_address: 172.22.0.2
redis:
image: redis:latest
ports:
- "6379:6379"
networks:
loki:
ipv4_address: 172.22.0.99

aliases

同一网络上的其他容器可以使用服务名称或此别名来连接到对应容器的服务。


restart

重启时的应对策略

  • no:是默认的重启策略,在任何情况下都不会重启容器。
  • always:容器总是重新启动。
  • on-failure:在容器非正常退出时(退出状态非0),才会重启容器。
  • unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
networks:
restart: always

注:swarm 集群模式,请改用 restart_policy。

secrets

存储敏感数据,例如密码:

version: "3.1"
services:

mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
secrets:
- my_secret

secrets:
my_secret:
file: ./my_secret.txt

service

子级变量说明备注
build宿主机的工作目录,构建镜像时的上下文路径构建时默认读取build指定目录下的Dockfile文件构建
ports端口配置设置端口的映射关系
volumes
container_name指定容器名称
command覆盖镜像的CMD命令
cgroup_parent为容器指定父 cgroup 组,意味着将继承该组的资源限制
depends_on依赖关系,根据依赖关系来顺序启动容器
expose暴露端口,但不映射到宿主机,只被内部连接的服务访问。

build

# 字符串形式:仅指定路径
# 这种形式下,默认使用 ./dir/Dockerfile
services:
web:
build: ./dir
# 对象形式:
services:
web:
build:
context: ./dir # 上下文路径
dockerfile: Dockerfile-alternate # 指定Dockerfile
args: # 添加构建参数,这是只能在构建过程中访问的环境变量。
buildno: 1
labels: # 设置构建镜像的标签。
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
target: prod # 多层构建,可以指定构建哪一层。
command: ["python", "main.py"]

version

volumes

volumes是用来定义挂载目录的

volumes:
dir-psd-tools-app:

配置文件

Docker-Compose.yml

# 基础语法
version: "3.9"
service:
{容器1}:
command:[] # 定义容器的启动命令,相当于覆盖 Dockerfile的CMD
build: . # Dockerfile的目录
prots: # 镜像暴露的端口 宿主端口:镜像端口
- "5000:5000"
expose: # 暴露端口,但不镜像映射
- "5000"
image:{容器1镜像} # 关联的镜像
profiles:
- debug
depends_on: # 依赖 容器2和容器3启动后才会启动容器1
- 容器2
- 容器n
- 容器3
{容器2}:
{容器n}:
version: "3.9"
services:
web:
build: ./webDockfileDir # Dockerfile的目录
ports:
- "5000:5000" # 镜像暴露的端口 宿主端口:镜像端口
redis: # 镜像在 docker内网的实例名称
build: ./redisDockfileDir
image: "redis:alpine" # 指定 docker images内的镜像

容器空运行

version: "3.9"

command: /bin/bash -c "while true; do echo hello world; sleep 10; done"

参阅文献